/*
 * 가능하면 전역 변수를 사용하지 않는 것이 좋으므로 즉시 실행함수로 전역공간의 오염을 막으면서, 
 * window를 모듈에 임포트해서 프로퍼티를 모듈에 직접 설정하는 방식으로 변수를 전역에 노출 시킨다
 */
// window 오브젝트 대신 전역 컨텍스트로 전역 변수를 만든다
var exports = this;

(function($){
	var mod = {};
	
	mod.subscribe = function(ev, callback) {
		var calls = this._callbacks || (this._callbacks = {});
		
		(this._callbacks[ev] || (this._callbacks[ev] = [])).push(callback);
		return this;
	};
	
	mod.slice = function(){
		console.log('asdfsf');
	}
	
	mod.publish = function() {
		// 오브젝트를 진짜 배열로 바꾼다
		// Array.prototype.slice는 인자로 시작위치와 종료위치를 받아서 기존 배열을 잘라 만든 새로운 배열을 리턴
		var args = [].slice.call(arguments, 0);
		
		// 이름을 포함하는 첫번째 인자를 추출한다
		var ev = args.shift();
		
		var list, calls;
		if ( !(calls = this._callbacks) ) return this;
		if ( !(list = this._callbacks[ev]) ) return this;
		
		// 콜백을 호출한다
		for (var i=0, length=list.length ; i<length ; i++) {
			console.log(list[i]);
		}
		
	};
	
	exports.Controller = mod;
	
}(jQuery));

$(document).ready(function(){
	
	Controller.subscribe("test", function(){ console.log("sb1"); });
	Controller.subscribe("test", function(){ console.log("sb2"); });
	Controller.subscribe("test", function(){ console.log("sb3"); });
	
	Controller.publish('test');
});